今天要來吧補充一下作天提到的 schema
內容~
在 postgres
中,一個類似於 workspace
的概念,就是 schema
他可以區隔不同的 index
不同的 table
等等,其目的是讓你好管理整個 DB
的 data flow
。
使先我們先進去 SQL
中
>psql
psql (14.10 (Homebrew), server 15.2)
WARNING: psql major version 14, server major version 15.
Some psql features might not work.
Type "help" for help.
接著打 \dn
去查看看當前有哪些 schema
預設情況會有一個 public
,所以在不使用我們自己定的 schema
前提,我們都是用 public
當作當前的 schema
。
> danny=# \dn;
List of schemas
Name | Owner
--------+----------
public | postgres
(1 row)
所以以下的寫法是一樣的意思。
> select * from posts;
> select * from public.posts;
然後我們先 create
一個 schema
>danny=# CREATE SCHEMA hr;
CREATE SCHEMA
在打一次 dn
你會看到成功新增一個 schema
了。
>danny=# \dn;
List of schemas
Name | Owner
--------+----------
hr | danny
public | postgres
(2 rows)
那要怎麼看到當前的 schema
是什麼呢?可以打以下的指令去看,你會看到我們當前就是 public
。
>danny=# select CURRENT_SCHEMA;
current_schema
----------------
public
(1 row)
如果要切換 schema
可以打 SET SEARCH_PATH=YOUR_SCHEMA_NAME
去切換。
>danny=# SET SEARCH_PATH=hr;
SET
你會看到成功切換 schmea
>danny=# select CURRENT_SCHEMA;
current_schema
----------------
hr
(1 row)
這時候你打 \dt
去看當前的 table
,你會發現因為你在新的 schema
中所以你完全是一個新的 workspace
自然也不會有任何的 table
紀錄。
>danny=# \dt;
Did not find any relations.
之後我們先 create
一個 table
。
CREATE table test100(name varchar(20),id int);
你會看到現在的 schema
就成功紀錄一個新 table
了。
>danny=# \dt;
List of relations
Schema | Name | Type | Owner
--------+---------+-------+-------
hr | test100 | table | danny
(1 row)
那上面說道 schema
是切換不同工作區,所以 table
這些都是獨立分開的,那要怎麼驗證這件事,很簡單就先切換成 public
的 schema
看看。
danny=# SET SEARCH_PATH=public;
SET
你會發現根本沒有 test100
這個 table
>danny=# \dt;
List of relations
Schema | Name | Type | Owner
--------+---------------------+-------+----------
public | Account | table | danny
public | CategoriesOnPosts | table | danny
public | Category | table | danny
public | Conversation | table | danny
public | Message | table | danny
public | Post | table | danny
public | Session | table | danny
public | User | table | danny
public | VerificationToken | table | danny
public | _ConversationToUser | table | danny
public | _prisma_migrations | table | postgres
public | _seeners | table | danny
public | timestampTest | table | danny
(13 rows)
所以自然也不能 select
。
>danny=# select * from test100;
ERROR: relation "test100" does not exist
LINE 1: select * from test100;
最後當你要 delete
一個 schema
可以直接打 drop
。
>danny=# drop schema hr;
但你會發現你完全不能 drop
原因是 schema
已經有 depend on
特定的 table
了,所以如果要 drop
已經使用過的 schema
顯然是不行的。
>danny=# drop schema hr;
ERROR: cannot drop schema hr because other objects depend on it
DETAIL: table hr.test100 depends on schema hr
HINT: Use DROP ... CASCADE to drop the dependent objects too.
如果要刪除已經使用過的 schema
你必須要加上 cascades
這樣才能成功刪除。
>danny=# drop schema hr cascade;
NOTICE: drop cascades to table hr.test100
DROP SCHEMA
以上就是今天的內容希望對大家有幫助~
✅ 前端社群 :
https://lihi3.cc/kBe0Y